#' 单变量优化黄金分割算法
#'
#'@description 求函数f的最大值
#' @param f 要优化的函数
#' @param ay 区间最小值点
#' @param by 区间中间点，随意
#' @param cy 区间最大值点
#' @param tol 容忍值
#' @return 返回函数的最大值对应的x
#'
#' @examples
#' testfunc <- function(x) -x**2 + 4*x + 6
#' GoldenSectionMax(testfunc,-2.2,0,10,0.001)
GoldenSectionMax <- function(f,ay,by,cy,tol = 0.001,...){
  r1 <- 0.61803399
  r2 <- 1-r1
  x0 <- ay
  x3 <- cy
  if (abs(cy-by) <= abs(by-ay)){
    x1 <- by
    x2 <- by + r2 * (cy-by)
  } else {
    x2 <- by
    x1 <- by - r2 * (by-ay)
  }


  f1 <- - f(x1,...)
  f2 <- - f(x2,...)

  while (abs(x3-x0) > tol*(abs(x1)+abs(x2))){
    if (f2<f1){
      x0 <- x1
      x1 <- x2
      x2 <- r1*x1+r2*x3
      f1 <- f2
      f2 <- -f(x2,...)
    } else{
      x3 <- x2
      x2 <- x1
      x1 <- r1*x2+r2*x0
      f2 <- f1
      f1 <- -f(x1,...)
    }
  }

  if (f1 <= f2){
    xmax <- x1
  } else{
    xmax <- x2
  }

  return(xmax)
}
